/*******************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.        */
/*                                                                 */
/*  NAME      = frservice_mng.h                                    */
/*  NOTE      = 主机服务管理                                       */
/*  DATE      = 2015/11/27                                         */
/*******************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <strings.h>

#include "frcomm.h"
#include "frlog.h"
#include "frmem.h"
#include "frlist.h"
#include "frhash2.h"

#include "frservice_comm.h"
#include "frservice_mng.h"

#define APM_HASH_SERVICE_SIZE     100000

FR_STATIC Frhash_header *g_p_st_hash_service = NULL;
FR_STATIC pthread_spinlock_t g_splock_srv_mng;

/*******************************************************************************
*  FUNC     :  主机服务资源初始化
*  ARGS     :
*  RTN      :  FR_SUCC:成功,FR_FAIL:失败
*  NOTE     :
*******************************************************************************/
int frservice_mng_init(void)
{
    pthread_spin_init(&g_splock_srv_mng, 0);

    g_p_st_hash_service = frhash2_create2(APM_HASH_SERVICE_SIZE);
    if(g_p_st_hash_service == NULL)
    {
        pthread_spin_destroy(&g_splock_srv_mng);
        FRLOG_ERROR_DETAIL("frhash2_create2 err");
        return FR_FAIL;
    }

    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  设置服务关联信息
*  ARGS     :
*  RTN      :
*  NOTE     :
*******************************************************************************/
void frservice_setRef(Frservice_ref *p_st_serviceRef)
{
    if(p_st_serviceRef == NULL)
        return;

    p_st_serviceRef->p_hash_hdr = g_p_st_hash_service;
    p_st_serviceRef->p_splock = &g_splock_srv_mng;
    return;
}


/*******************************************************************************
*  FUNC     :  释放节点内容
*  ARGS     :  p_node
*  RTN      :
*  NOTE     :
*******************************************************************************/
FR_STATIC void __frservice_node_free(Frlist_node* p_st_node)
{
    Host_service *p_st_service = NULL;

    if (p_st_node && p_st_node->data)
    {
        p_st_service = (Host_service *)(p_st_node->data);
        if(p_st_service->p_data)
        {
            frfree(p_st_service->p_data);
        }
        frfree(p_st_service);
    }
    return;
}

/*******************************************************************************
*  FUNC     :  协议管理资源释放
*  ARGS     :
*  RTN      :
*  NOTE     :
*******************************************************************************/
void frservice_mng_destory(void)
{
    if(!g_p_st_hash_service)
        return;

    pthread_spin_destroy(&g_splock_srv_mng);

    if(g_p_st_hash_service)
        frhash2_free2(g_p_st_hash_service, __frservice_node_free);

    g_p_st_hash_service = NULL;

    return;
}


